이 문서를 읽는 사람들이라면 HTML로 다양한 요소를 표현하고, CSS로 각 돔을 꾸며주고, JS로 다이나믹한 페이지를 만들 수 있을 것이라고 생각한다.
하지만 이것만 알아서는 그냥 준비된 종이에 그림만 그릴 줄 아는 것이다. 실제로 종이는 어떤 질감에 어떤 물감을 사용하는지 알아야 더 실력이 늘듯이 이 다음으로는 '실제 브라우저가 어떻게 돌아가는지'를 알아야 한다.
디스플레이가 초당 화면을 그리는 것을 fps (frame per second)라는 표현을 사용한다. 디스플레이가 1초에 60번 바뀌는데 웹페이지가 1초에 10번 그려진다면, 버벅이는 현상이 발생할 것이고 이런 현상을 Jank라고 부른다. 웹페이지의 렌더링의 과정을 알고 최적화를 한다면 브라우저가 1초에 60번 렌더링이 될 수 있도록 변경해줄 수 있게 된다.
"참 쉽죠?"
최적화를 하려면 브라우저가 화면을 어떻게 그리는지 알아야 하는데, 화면을 그릴 때 사용하는 엔진은 크게 Webkit엔진 (Chrome, safari)와 Gecko엔진 (Firefox)이 있다. 브라우저는 이런 엔진을 사용해서 화면을 그리는 데 거치는 주요한 과정을 Critical Rendering Path (주요 렌더링 경로)라고 부른다.
Render Tree (Gecko에서는 Frame Tree)를 만든다.
{display: none} 등으로 이루어진 것들은 Tree에 있어도 Render Tree에는 없고, head 태그의 메타 내용들도 존재하지 않는다.position, width, height 등등 위치에 관련된 부분들을 계산한다.position: fixed, position: absolute, float: left 등 전체적인 레이아웃(flow)와 분리된 레이아웃은 따로 노드를 만들어 처리한다.const changeDivStyle = () => {
const sample = document.querySelector(".sample");
// bad (x)
sample.style.width = '100px';
sample.style.height = '100px';
// right (o)
sample.style.cssText = 'width: 100px; height: 100px;';
/**
* bad 예제를 보면 각각 고쳐서 reflow가 2번 일어나게 된다.
* 그러므로 cssText로 한번만 실행되도록 할 수 있다.
*/
}
changeDivStyle();position:fixed 등으로 전체 레이아웃과 분리한 후 진행한다.
